/**
 * 提取函数中的常量
 */


const babel = require('@babel/core');
const parser = require('@babel/parser');
const traverse = require('@babel/traverse').default;
const generate = require('@babel/generator').default;

// 要转换的代码
const code = `
function calculate() {
    const pi = 3.14;
    const radius = 5;
    return pi * radius * radius;
}
`;

// 解析代码为 AST
const ast = parser.parse(code);

// 定义 visitor 对象
const constants = [];
const visitor = {
    VariableDeclaration(path) {
        // 只提取常量
        if (path.node.kind === 'const') {
            path.node.declarations.forEach(declaration => {
                constants.push(declaration);
            });
            path.remove(); // 删除常量声明
        }
    }
};

// 遍历 AST
traverse(ast, visitor);

// 在函数外部添加常量
if (constants.length > 0) {
    const functionBody = ast.program.body[0].body.body;
    functionBody.unshift(...constants.map(declaration => ({
        ...declaration,
        id: {
            ...declaration.id,
            name: declaration.id.name // 保持原名
        }
    })));
}

// 将修改后的 AST 转换回代码
const { code: transformedCode } = generate(ast);

// 输出转换后的代码
console.log(transformedCode);


// 输出
// const pi = 3.14;
// const radius = 5;

// function calculate() {
//     return pi * radius * radius;
// }